#include "game.h"
#include "display.c"
#include "btns.c"
#include "uart.c"
#include "timer.c"

/**
 * data 128 字节  声明变量默认的存放位置
 * idata 128 字节
 */
unsigned int idata GAME_ZONE[19];

/**
 * 0x2004  中间的0代表10列游戏区域，1代表墙壁用于碰撞检查
 * 对应屏幕从上到下，对应数组下标0~15
 * 16~19全部填充1，用于碰撞检测，防止数组越界
 */
void init_game_zone()
{
    unsigned char i;
    for (i = 0; i < 16; i++)
    {
        GAME_ZONE[i] = 0x2004;
    }

    for (i = 16; i < 19; i++)
    {
        GAME_ZONE[i] = 0xFFFF;
    }
}

/**
 * GAME_ZONE 里面所有的数据显示到屏幕上
 */
void display_refresh_game_zone()
{
    // 游戏区行数是16行，每两行一起进行显示
    unsigned char row;
    unsigned char col;
    unsigned char top;
    unsigned char bottom;
    unsigned char display_bytes[4];
    // 每两行一起处理，一共需要处理8次
    for (row = 0; row < 8; row++)
    {
        // 一共处理10列
        for (col = 0; col < 10; col++)
        {
            // 第一行
            // 存储的数据，最左边的一位是第12位
            top = (((GAME_ZONE[row * 2] >> (12 - col)) & 1) == 1);
            // 第二行
            bottom = (((GAME_ZONE[row * 2 + 1] >> (12 - col)) & 1) == 1);
            fill_display_block_arr(top, bottom, display_bytes);
            lcd_display_bytes_in_page(row, 31 + col * 4, display_bytes, 4);
        }
    }
}

void init_shape()
{
    update_timer_seed();
    game_shape.pos = timer_rand() % 4;
    game_shape.type = timer_rand() % 7;
    game_shape.shape = TETRIS_SHAPES[game_shape.type][game_shape.pos];
    update_timer_seed();
    game_shape.next_pos = timer_rand() % 4;
    game_shape.next_type = timer_rand() % 7;
    game_shape.next_shape = TETRIS_SHAPES[game_shape.next_type][game_shape.next_pos];
}

void timer0_ISR() interrupt 1
{
    display_refresh_game_zone();
}

void main()
{
    uart_init();
    timer0_init();
    init_game_zone();
    display_init();
    display_init_game_page();

    GAME_ZONE[0] = 0x3F04;
    GAME_ZONE[2] = 0x20FC;

    timer0_isr_on();

    while (1)
    {
    }
}